Skip to content

Replace Blockstream Jade listing with Jade Classic, Jade Plus, and Jade Core#4728

Open
bitcoinhelp wants to merge 2 commits into
bitcoin-dot-org:masterfrom
bitcoinhelp:update-jade-listings
Open

Replace Blockstream Jade listing with Jade Classic, Jade Plus, and Jade Core#4728
bitcoinhelp wants to merge 2 commits into
bitcoin-dot-org:masterfrom
bitcoinhelp:update-jade-listings

Conversation

@bitcoinhelp

Copy link
Copy Markdown

Blockstream now sells three distinct Jade hardware wallet products. This PR replaces the single "Blockstream Jade" listing with individual entries for each device.

Changes

  • Removed existing Jade listing
  • Added new listing for Jade Classic
  • Added new listing for Jade Plus
  • Added new listing for Jade Core
  • Updated _translations/en.yml with descriptions for all three products
  • Added product screenshots (250x350 px, optimized with optipng -o7)
  • Added wallet icons (144x144 px, reused from original listing)

Closes #4683

Rich Grambergs added 2 commits May 14, 2026 13:40
Blockstream now sells three distinct hardware wallet products. This replaces
the single Jade entry with individual listings for each device, with updated
descriptions, product images, and translation entries.

Closes bitcoin-dot-org#4683
@devdavidejesus

Copy link
Copy Markdown
Collaborator

LGTM

@devdavidejesus

Copy link
Copy Markdown
Collaborator

@bitcoinhelp, I'm working with @crwatkins on the bitcoin.org wallet reviews. One remaining step on our side is a hands-on physical test of the three Jade models. I can send the shipping details by email.

@bitcoinhelp

Copy link
Copy Markdown
Author

@devdavidejesus happy to get you some units! just sent over an email

@devdavidejesus

Copy link
Copy Markdown
Collaborator

@devdavidejesus happy to get you some units! just sent over an email

Thanks! Just replied to the email.

@devdavidejesus

devdavidejesus commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Blockstream Jade (Classic · Plus · Core) — Review for bitcoin.org listing (PR #4728)

Wallet family: Blockstream Jade — three models: Classic, Plus, Core
Developer: Blockstream
Device type: Hardware wallet (Bitcoin + Liquid)
Audited firmware: 1.0.40 (git tag 1.0.40, commit 6f858f39)
Source repo audited: github.com/Blockstream/Jade (cloned, tag checked out)
Review version: 2026062401
Reviewer: Davi de Jesus
Review feedback incorporated from: Craig Watkins (@crwatkins), reviewer of the original
Jade listing (#4000). His feedback on this PR directly improved the review — see the
"Changes from reviewer feedback" note below.


Changes from @crwatkins's feedback (updated 2026-06-24)

This review was originally posted on 2026-06-23. After @crwatkins's feedback on this PR
(2026-06-24), it was updated on the four points below. Credit for these corrections is his:

  1. Taproot feature — he noted that feature selection reflects device capability and
    should not depend on the review's test methodology. This corrected our initial decision
    to omit taproot; the feature is now marked (send + receive of bc1p re-verified in code).
  2. 3-month criterion — he confirmed the recommendation to list all three and waive the
    minimum-time criterion on the newest device, and supplied the Coldcard Q precedent
    that we lacked. Verified: the Coldcard Q kept the full good/deterministic transparency
    score with the time clause waived (not a lowered score).
  3. Descriptions — he recommended shortening them by removing the Liquid reference and
    the unreviewed companion-wallet references, which also resolves the character-limit issue.
  4. H5 (PIN protocol spec) — his original observation in Add Blockstream Jade as HWW #4000 remains the basis of the
    formal-specification suggestion to Blockstream.

Why a single review for the three models

This review covers all three products in PR #4728 in one document because the source-code
audit proved that all three run identical firmware (same tag 1.0.40, same signing,
address, PIN and attestation files). What differs between them is physical hardware
(camera, battery, connectivity) and cosmetics (icon, screenshot, name). The entire
security/firmware assessment is shared; per-model differences are isolated in the
"Per-model differences" section.

PR #4728 is, in practice, a 1→3 split of the existing jade.md: it replicates
identical features and scores from the original file (verified via
git show master:_wallets/jade.md), changing only name, screenshot and icon per model.


Method

  • Hands-on physical testing of the three real units: Classic (device A050F8),
    Plus (BDB9CC), Core (BE0704), via the Blockstream/Green app.
  • Source-code audit at the exact tag tested (1.0.40), with every claim anchored to
    file:line.
  • Live site checks (HSTS, SSL, redirects).

Scope (precedent from PR #4000, @crwatkins): as a hardware wallet, only
hardware/firmware were assessed.
The companion software (Blockstream/Green) was used
to operate the devices but not assessed. The units were provided by Blockstream at no
cost.


Verdict per model

Model Verdict Note
Jade Classic Recommended No technical reservations. Tested on iOS + Android.
Jade Plus Recommended No technical reservations. Tested on iOS + macOS + Android; air-gap (QR + JadeLink) exercised.
Jade Core Technically approved Identical firmware, audited; tested on macOS. The only open item is non-technical: the maintainer's decision on the ≥3-month requirement (launched 2026-04-28).

As reviewer, I recommend Jade Classic and Jade Plus for listing, with no technical
reservations. Jade Core is technically approved — it passes the same audit (identical
firmware) — but its listing depends on the maintainer's decision regarding the ≥3-month
requirement, which is repo policy rather than a technical matter. This is a reviewer's
recommendation; the merge and any policy decision rest with the maintainer (@Cobra-Bitcoin).


Basic Requirements (shared — identical firmware/company)

Reviewer's organizational numbering.

# Requirement Status Note
1 Sufficient users/devs feedback, or independent audit PASS Jade line on the market since 2021; extensive discussion and third-party reviews. Ledger Donjon "Evil-Maid" as background; no listing criterion covers physical access.
2 No users harmed considerably PASS No known losses. Vulnerability in the register_descriptor RPC (versions 1.0.24–1.0.36), publicly disclosed by Blockstream itself after a responsible report from an external security researcher; fix released in 1.0.37 (2025-11-13), public disclosure 2025-12-17. Blockstream: no evidence of real-world exploitation and no known malware; exploitation would require model-specific malware + pairing with a malicious platform/app. The audited tag (1.0.40) is immune (1.0.37+ not affected). Source: official Blockstream blog (jade-security-disclosure).
3 No security issues concealed/ignored PASS Responsible, transparent disclosure: fix in 1.0.37 (2025-11-13, ~3 weeks after the report), 1.0.38 (one week later) enabled anti-rollback to prevent downgrade to affected versions, and detailed public disclosure on 2025-12-17 (official blog + credit to the reporting researcher). Exemplary incident-response pattern. Public tracker.
4 No unstable/insecure libraries PASS ESP-IDF + libwally, open source. (CVE-2025-27840 in the ESP32 chip: Blockstream stated Jade is not affected; claim publicly contested, no acknowledged pending fix.)
5 Changes properly tested PASS test_jade.py suite in the repo.
6 Publicly announced and released ≥ 3 months PASS (Classic/Plus) / see note (Core) Jade line since 2021; Classic and Plus available for much longer than 3 months. Jade Core launched 2026-04-28 — see "Per-model differences".
7 No concerning bug found when testing PASS Classic: iOS + Android. Plus: iOS + macOS + Android. Core: macOS. Genuine check, firmware update, pairing, bc1q and Liquid address generation — no bugs.
8 Bug reporting method PASS help.blockstream.com
9 HTTPS + 301 redirect PASS curl -sI http://blockstream.com/HTTP/1.1 308 Permanent Redirect to https:// (308 preserves the method; equivalent to 301 for the criterion). Verified by real header on 2026-06-23 19:27 UTC.
10 SSL Labs PASS A+ confirmed by direct SSL Labs (Qualys) assessment, screenshot verified by the reviewer — assessed on 2026-06-23 19:28 UTC. All four components green (Certificate, Protocol Support, Key Exchange, Cipher Strength); TLS 1.3 active; long-duration HSTS; CAA policy present. TLS also reconfirmed via local handshake (openssl, 2026-06-23); valid Google Trust Services certificate (issued 2026-06-18, expires 2026-09-16). Was B in 2023 (#4000). (SSL Labs informational notice: server does not support PQC key exchange — does not affect the grade nor is it a requirement.)
11 HSTS (max-age ≥1y + preload + includeSubDomains) PASS Real header (curl -sI, 2026-06-23 19:27 UTC) on https://blockstream.com/jade/ and on the root domain: strict-transport-security: max-age=31536000; includeSubDomains; preload — meets all three requirements (1 year, subdomains, preload). Was the only FAIL in #4000 — now resolved, confirmed by HTTP header (not just by an external tool).
12 Identity public PASS blockstream.com/about/
13 Address reuse — receiving (UI) N/A / PASS Addresses chosen by the companion; the app generates a new address on each Receive (refresh confirmed).
14 Address reuse — change N/A Chosen by the companion.
15 Does not show "received from" N/A Origin is the companion's.
16 RFC 6979 nonces PASS fw 1.0.40 code: wallet.c:1144-1147 uses anti-exfil with host entropy, otherwise standard EC via RFC6979 with grind-r (low-r). Anti-exfil verifiable via commit-reveal (sign_tx.c:557-578, host→signer commitment).
17 Access to private keys PASS Seed generated on the device; PIN exclusive to the device. Anti-brute-force proven by code: keychain.c:502 decrements a counter per attempt, :523 triggers wipe on exhaustion, remaining attempts exposed (keychain.c:677, auth_user.c:66).
18 Keys stored online — weak pwd N/A Keys on the device.
19 HD wallets (BIP32) PASS BIP84 (Native SegWit) / BIP49 (Legacy SegWit) singlesig accounts confirmed at account creation.
20 Backup of seed on setup PASS (reviewer report) Seed write/verification on the device screen tested and OK (no screenshot).
21 Restore from backup works PASS (reviewer report) Backup → reset → restore tested and OK (no screenshot).
22 Source public, versioned PASS github.com/Blockstream/Jade/
23 Multi-sig non-self-controlled N/A

For hardware wallets (shared — identical firmware)

# Hardware requirement Status Note
H1 Push model (malware cannot sign without user input) PASS Receive requires "Verify on device"; genuine check requires physical confirmation; signing-tx confirmation tested and OK (report).
H2 Protects seed against unsigned firmware PASS Proven by code (tag 1.0.40): production/sdkconfig_jade_v2_prod.defaults:73 (and v2c, v1_1) enables CONFIG_SECURE_BOOT=y + SECURE_FLASH_ENCRYPTION_MODE_RELEASE (line 78). production/README.txt: "enable secure-boot and flash-encryption, and the app cannot be flashed without first being signed". Signing via espsecure.py sign_data --version 2 (REPRODUCIBLE.md:65). The SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS=y flag is documented in main.c:87-99 (part of V2 attestation provisioning, secure at the factory, guarded by #error) — not a weakness. The guarantee comes from the production build (factory eFuse). Exercised in testing (forced update with hash).
H3 Ability to prevent downgrade PASS Evolution since #4000 (was opt-in in 2023). Production configs for all three enable it by default: BOOTLOADER_APP_ANTI_ROLLBACK=y, ROLLBACK_ENABLE=y, APP_SECURE_VERSION=2. Runtime: main/process/ota_util.c:427 esp_efuse_check_secure_version. State reportable by the device (JADE_FEATURES, ATTESTATION_INITIALISED, versioninfo.c:55,73) — verifiable without esptool.
H4 Imports custom seeds PASS (tested) Tested hands-on on the Jade Plus (12-word BIP39 phrase): the device accepted the correct phrase and initialized; and rejected a phrase with the last word swapped, displaying "Incorrect. Check your recovery phrase and try again." — confirming checksum validation. Capability also anchored in code: mnemonic.c:84 bip39_mnemonic_to_bytes, 12/24 words (:81,85), checksum rejection (:377). Identical firmware across the three models, so the test holds for Classic/Plus/Core.
H5 Open source + spec for closed-source SE PASS Open source; blind oracle (virtual SE, no physical closed-source SE). We confirmed Craig's observation in #4000: there is no published formal specification of the PIN protocol — understanding it requires reading the code. Detail of main/process/pinclient.c (tag 1.0.40): ECDH handshake with an ephemeral client key (cke) + tweaked server key (ske, generate_ske line 150); AES-CBC payload with ECDH key (wally_aes_cbc_with_ecdh_key line 218); HMAC and anti-replay (32-bit counter, line 64); blind_oracle_request/response labels; default endpoint https://j8d.io + onion; embedded and validated pubkey (wally_ec_public_key_verify line 163); the user can change URL+pubkey with on-device confirmation (update_pinserver, storage.c:30-31, reset_pinserver). Craig's reservation stands (no formal spec nor independent audit); not blocking (everything is open). Progress since 2023: there is an independent third-party reimplementation (SimpleJadePinServer), proving the protocol is reimplementable from the open-source code.

Conditional criteria that do not apply (N/A): the managing-wallets.md "On desktop
platform" sub-requirements (encrypt the wallet by default; strong KDF/key stretching for
wallet storage) target desktop software wallets — Jade is a hardware device, so they do
not apply. Likewise, the "no access to some private keys in a multi-signature wallet"
sub-requirements (2FA, non-persistent session, etc.) target custodial/co-signed software
models, not a self-custody hardware signer; N/A here.


Genuine Check / attestation (shared)

On first connection the app requires a Genuine Check (mandatory), confirmed on the
device
. It is RSA-4096 attestation proven by code: main/process/register_attestation.c
drives the process and main/attestation/attestation.c implements it using mbedtls RSA
(#include <mbedtls/rsa.h>) over the ESP32 Digital Signature peripheral (#include <esp_ds.h>,
rsa_length == ESP_DS_RSA_4096, line 95) — the device signs a challenge with a hardware-protected
RSA-4096 key to prove Blockstream authenticity, which is the cryptographic proof behind the
"Jade is genuine" screen. Exercised in the physical tests.


Features (shared)

features: "bech32 hardware_wallet legacy_addresses multisig segwit taproot"

  • bech32 / segwitPASS "Standard / Native SegWit" policy generates bc1q (tested).
  • legacy_addressesPASS "Legacy SegWit" policy available at account creation.
  • multisigPASS Confirmed in code (main/ui/multisig.c, register_multisig.c).
  • hardware_walletPASS (it is the device itself).
  • taprootQUALIFIES (send + receive of bc1p, proven by code; see note below).
    This is a change from master (jade.md lacked taproot); adding the feature is a
    recommended correction, per @crwatkins's note on PR Replace Blockstream Jade listing with Jade Classic, Jade Plus, and Jade Core #4728 that feature selection reflects
    device capability and does not depend on the review's test methodology.

Taproot — feature confirmed (send + receive of bc1p, proven by code)

Initially this review left taproot out, reasoning that the tested flow (Blockstream/Green
app) did not make generating a bc1p "easy and obvious". @crwatkins, reviewer of the original
Jade listing (#4000), noted on this PR that feature selection reflects device capability
and should not depend on the review's test methodology
— a wallet that can sign Taproot
should carry the feature. Re-checked against the firmware at tag 1.0.40, the capability is
present in both directions the criterion requires:

  1. Receive (derive/show a bc1p address): wallet.c:61 defines VARIANT_P2TR "tr(k)";
    wallet.c:936 builds the P2TR scriptpubkey; wallet.c:286-287 maps
    WALLY_SCRIPT_TYPE_P2TR → P2TR; wallet.c:298 lists P2TR among the valid singlesig
    variants; get_receive_address.c routes the variant parameter through the singlesig
    path. Comment at wallet.c:909: "segwit v1 p2tr (keyspend only)" — key-path spending,
    the standard singlesig case.
  2. Send (sign a spend from a P2TR input): sign_tx.c:539 counts num_p2tr_to_sign;
    sign_tx.c:797-819 is a dedicated loop that computes the BIP-341 sighash and signs the
    taproot inputs (handling the Liquid genesis-blockhash case too).

Both send and receive are therefore demonstrated in source, satisfying the criterion's
"send and receive Bech32m (bc1p)" requirement.

Note on the tested app vs. capability: in the Blockstream/Green app flow we exercised
hands-on, account creation offered only Native SegWit (bc1q) and Legacy SegWit, with no
Taproot selector on the Receive screen. Via QR/air-gapped, Taproot is selectable
(qrmode.c:207 returns P2TR; the selector at qrmode.c:137 rotates "Legacy → wrapped →
segwit → taproot"). Per @crwatkins's point, feature tagging follows the device's capability
(proven above), not which path the default app exposes — so taproot is marked.

This is a change from master: the original jade.md did not carry taproot. Adding it
to all three files is a recommended correction, not a replication of the prior listing. The
author (@bitcoinhelp) should add taproot to the features line of the three .md files.


Score decisions (shared — identical to master's jade.md)

Verified via git show master:_wallets/jade.md: the 6 scores are identical across the
three PR files and to the original jade.md. The PR replicates, does not alter.

check:
  control: "checkgoodcontrolfull"                    # good: exclusive control (keys on device)
  validation: "checkneutralvalidationvariable"       # neutral: validation via chosen Electrum
  transparency: "checkgoodtransparencydeterministic" # good: open-source + reproducible + >6m + tags
  environment: "checkgoodenvironmenthardware"        # good: dedicated device, no installable apps
  privacy: "checkneutralprivacyvariable"             # neutral: rotates addr, network depends on server
  fees: "checkneutralfeecontrolvariable"             # neutral: fees via companion
  • control good — keys on the device, local PIN, blind oracle does not access funds.
  • validation neutral — not a full node; validation depends on the Electrum server.
  • transparency good/deterministicCONFIG_APP_REPRODUCIBLE_BUILD=y, REPRODUCIBLE.md,
    tags 1.0.27→1.0.40, repo since 2021 (>6 months). Deterministic build.
  • environment good — dedicated hardware, no installable apps.
  • privacy neutral — rotates addresses; network privacy depends on the server/Tor.

Per-model differences (what actually changes)

Hardware mapping proven by code (main/Kconfig.projbuild, tag 1.0.40):

Classic Plus Core
Board config JADE / JADE_V1_1 JADE_V2 JADE_V2C
USB string "Jade Plus" "Jade Core"
Camera (HAS_CAMERA) select (JADE:53 / V1_1:60) select (V2:67) ❌ not selected (V2C:71-75)
Battery (HAS_BATTERY) ✅ (Kconfig:68)
QR / air-gapped signing ✅ (tested OK) ✅ (tested OK) N/A (no camera)
SD card / JadeLink ✅ (JadeLink tested OK)
Hardware origin Original Jade (2021) advanced model simplified model (2026-04-28)
Platforms tested iOS + Android iOS + macOS + Android macOS
Screenshot RGB RGB grayscale (jadecore.png confirmed by file as 8-bit grayscale, mode L; Classic/Plus are RGB. The screen shows no visible content and the body is dark, so no practical visual impact; reason for the grayscale encoding not determined — not verified, non-blocking)
≥3-month requirement passes (2021) passes see below

All three use the same power file (main/power/jadev20.inc via BOARD_TYPE_JADE_V2_ANY);
camera/battery are gated by #ifdef CONFIG_HAS_CAMERA/HAS_BATTERY, so the code for those
features simply does not compile on the Core.

Literal proof in code: Kconfig.projbuild:72 describes the Core board textually as
"Blockstream Jade Core (Jade v2, no camera, no battery)" — and the BOARD_TYPE_JADE_V2C
block (lines 71-75) selects only HAS_AXP, BOARD_TYPE_JADE_ANY and BOARD_TYPE_JADE_V2_ANY,
without select HAS_CAMERA or select HAS_BATTERY (which V2/Plus has, lines 67-68).
This is not inference: it is Blockstream itself declaring in the code that the Core is the
V2 without camera and without battery.

Jade Core — the 3-month requirement (maintainer's decision)

The Core was publicly launched on 2026-04-28, confirmed by the URL of the official
press release itself (blockstream.com/press-releases/2026-04-28-blockstream-introduces-jade-core/).
As of 2026-06-23 that is ~8 weeks — below the 3-month minimum if the criterion is
applied to the individual model. If applied to the Jade line (since 2021), it passes.

Reviewer's recommendation: apply the criterion to the line. Technical basis (proven in
this audit): the Core runs identical firmware to Plus/Classic (same tag 1.0.40, same
audited security files); it differs only in physical I/O. No new security code is
introduced by the model, so the line's maturity covers the Core. Official confirmation
from Blockstream itself:
the blog "The Jade Lineup, Reimagined" states verbatim that
"every device runs identical open-source firmware and the same Blind Oracle security
model"
; and the launch press release (2026-04-28) describes the Core as "built on the
same open-source security foundation as the company's existing Jade product line"
— i.e.,
the firmware/security equivalence we proved by code is also a public statement by the
manufacturer, across two distinct official documents. Final decision deferred to Cobra
(maintainer) — it is repo policy, not audit.


Assets and PR structure (#4728) — audited on the branch

Structure confirmed on the PR branch (local clone, not web_fetch): jade.mdjadecore.md
and jade.pngjadeclassic.png via git rename; 3 new .md files (level 2, same features
and scores); descriptions in _translations/en.yml:308-310; total diff 11 files,
+62/−6
. The 3 .md files have identical content except for id/title/screenshot/text key.

File Spec Status
img/wallet/jadeclassic.png 144×144, 4-bit colormap (575 B) OK
img/wallet/jadeplus.png 144×144, 4-bit colormap (575 B) OK
img/wallet/jadecore.png 144×144, 4-bit colormap (575 B) OK
img/screenshots/jadeclassic.png 250×350, RGB (28,771 B) OK
img/screenshots/jadeplus.png 250×350, RGB (30,694 B) OK
img/screenshots/jadecore.png 250×350, 8-bit grayscale (11,355 B; confirmed by file) Compliant in dimensions and optimized. The file is grayscale (mode L) while Classic/Plus are RGB. The screen shows no visible content in any of the three screenshots and the Core body is dark, so a grayscale encoding has no practical visual impact here. The exact reason for the grayscale encoding was not determined (could be the photo itself or the export); not verified, and not a blocking issue either way.

optipng -o7 (required by the criteria): the three screenshots pass — optipng -o7 -simulate
reports each as "already optimized". Dimensions (250×350) and icon size (144×144) also conform.

Note on the en.yml descriptions — character-limit violation (author must fix):
The criteria require each description to be < 320 characters. Measured against the PR
branch:

  • walletjadeclassic: 336 chars — exceeds by 16 ❌
  • walletjadeplus: 332 chars — exceeds by 12 ❌
  • walletjadecore: 314 chars — OK ✓

Two of the three descriptions are over the limit and must be shortened by the author. No
prohibited superlatives were found, and the content (promoting use with Sparrow/Specter/
Nunchuk via QR; see the Taproot discussion above) is otherwise consistent in style. This is
a concrete non-conformance with managing-wallets.md, not a style preference.

PR merge state

Verified via GitHub API and local merge simulation (reconfirmed on 2026-06-23): the PR is
mergeable: false / mergeable_state: dirtycannot be merged as-is. The branch
is 67 commits behind master (2 ahead) and has not been updated since 2026-05-28.

  • _translations/en.yml — auto-merge resolves (no real conflict).
  • _wallets/jadecore.md — content CONFLICT requiring manual resolution. Likely cause:
    it is the file renamed from jade.md, which was touched on master in those 67 commits;
    Git does not auto-reconcile rename + edit.

CI (Travis): the PR build passesTravis CI - Pull Request → completed / success
(head commit 52ffe443, verified 2026-06-19 via GitHub API). The content is valid for CI.
(The API's "combined status: pending" is merely an artifact of GitHub's two APIs —
statuses vs check-runs — not a failure; the actual check is in success.)

Forwarding: the PR content is technically correct (fully audited in this review) and
passes CI
, but the author (@bitcoinhelp) needs to rebase onto current master and resolve
the conflict in jadecore.md before any merge.
The technical approval in this review
should not be confused with merge-readiness — they are distinct: the code is valid (CI
green), but the merge is blocked by the conflict (dirty state).


Open items and suggestions

Author must fix (concrete non-conformance with managing-wallets.md):

  • Description character limit (< 320): walletjadeclassic is 336 chars and
    walletjadeplus is 332 chars — both over the limit (walletjadecore 314, OK). The
    author must shorten the two descriptions. Measured on the PR branch on 2026-06-23.
    Per @crwatkins's review: shorten by removing the reference to Liquid (no other
    non-Bitcoin chain is referenced in any wallet description) and removing references to
    companion wallets
    other than the native app (Sparrow/Specter/Nunchuk have not been
    reviewed; for consistency other listings don't name them, and naming them could imply a
    recommendation). This both fixes the length and improves consistency.
  • PR in dirty state (merge conflict): the branch is 67 commits behind master;
    _wallets/jadecore.md has a content conflict. The author needs to rebase and resolve
    before the merge. Reconfirmed on 2026-06-23 (mergeable: false, branch unchanged since 05-28).

Maintainer's decision (Cobra) — non-technical:

  • Jade Core ≥3-month requirement — reviewer's recommendation: list all three and waive
    the minimum-time criterion on the newest device (Core), since the firmware is identical
    across the line. @crwatkins concurs and cites the Coldcard Q precedent. Verified
    against master:_wallets/coldcardq.md: the Coldcard Q kept the full
    checkgoodtransparencydeterministic score (same as the mature Coldcard), with the
    "public ≥6 months" time sub-clause effectively waived because it runs the same auditable
    open-source base. So the precedent is to keep the good/deterministic transparency score
    on the Core and waive the time clause
    , not to lower the score. The original Jade scores
    (verified identical across the three PR files) already use
    checkgoodtransparencydeterministic, so the Core should keep it. Final decision rests
    with the maintainer.

Improvement suggestions for Blockstream (non-blocking):

  1. Publish a formal specification of the PIN/blind-oracle protocol (a direct
    continuation of Craig's observation in Add Blockstream Jade as HWW #4000).
  2. Pursue a published independent security audit of the blind-oracle protocol.
  3. Better document the SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS flag in the production README
    (avoids misunderstanding by those who read the config without the context of main.c).
  4. Expose the secure-boot/anti-rollback status visibly in the UI to the end user.

Appendix — code anchors (tag 1.0.40, commit 6f858f39)

Topic File:line
Hardware mapping (camera/battery) main/Kconfig.projbuild:50-75 (JADE:50, V1_1:57, V2:64, V2C:71)
USB string per model configs/sdkconfig_dev_jade_v2.defaults:84 (Plus), _v2c:84 (Core)
Secure Boot v2 + Flash Encryption production/sdkconfig_jade_{v2,v2c,v1_1}_prod.defaults:73-78
Firmware signing REPRODUCIBLE.md:65 (espsecure.py sign_data --version 2)
Anti-rollback production/*_prod.defaults (BOOTLOADER_APP_ANTI_ROLLBACK, SECURE_VERSION=2); main/process/ota_util.c:427
Secure provisioning / eFuse flag main/main.c:87-99
RFC6979 / anti-exfil main/wallet.c:1144-1147; sign_tx.c:557-578
Anti-brute-force PIN main/keychain.c:502,523,677; auth_user.c:66
Blind-oracle PIN protocol main/process/pinclient.c (ECDH/generate_ske:150, AES :218, pubkey :163)
PIN server change update_pinserver, storage.c:30-31, reset_pinserver
Taproot — receive (P2TR scriptpubkey) main/wallet.c:61 (VARIANT_P2TR), :936, :286-287, :298
Taproot — send (sign P2TR input, BIP-341) main/process/sign_tx.c:539,797-819
Taproot via QR (xpub export) main/qrmode.c:207 (returns P2TR), :137 (rotation includes taproot)
Companion integration (Sparrow/Specter) main/selfcheck.c:411, main/qrmode.c:996, main/process/sign_message.c:160
Address type comes from companion main/process/get_receive_address.c:138
BIP39 seed import main/process/mnemonic.c:84,81,85,377
Multisig main/ui/multisig.c, main/process/register_multisig.c
Attestation (genuine check) main/process/register_attestation.c; main/attestation/attestation.c (mbedtls RSA, ESP-DS, ESP_DS_RSA_4096)
Reproducible build CONFIG_APP_REPRODUCIBLE_BUILD=y, REPRODUCIBLE.md, Dockerfile

@crwatkins

Copy link
Copy Markdown
Contributor

@devdavidejesus Thanks for the extremely comprehensive review.

In the descriptions (and particularly because they are too long) I would recommend removing the reference to Liquid since no other non-Bitcoin blockchains are referenced in any of the other wallet descriptions. I would also remove references to compatible companion wallets (other than perhaps the native app), especially those that have not been reviewed. We don't want to deny existence, but for consistency other wallets don't list them, and we don't want to imply a recommendation currently or in the future.

Since the firmware is the same on all devices, I would recommend we list all three devices and waive the minimum time criterion (along with the transparency score) on the newest device, as we did on the Coldcard Q for similar reasons.

I also recommend that if the devices can sign Taproot transactions they be listed with the Taproot feature. While criteria are judged based on the default configuration of the device, feature selection is not and should not depend on the review methodology.

@devdavidejesus

Copy link
Copy Markdown
Collaborator

@crwatkins Thanks, you're right on all four points, and I've updated the review above accordingly. Credit for these corrections is yours:

  1. Taproot — agreed. Feature selection should reflect capability, not the test methodology. I re-verified at tag 1.0.40 that the firmware both receives P2TR (wallet.c builds the P2TR scriptpubkey; P2TR is a valid singlesig variant) and signs P2TR inputs (sign_tx.c has a dedicated BIP-341 signing loop). So taproot should be listed on all three.
  2. 3-month criterion / Coldcard Q — agreed. I checked _wallets/coldcardq.md: it kept the full checkgoodtransparencydeterministic score with the time clause waived. The Jade files already use that same score, so the Core keeps it and we waive the time clause.
  3. Descriptions — agreed: removing the Liquid reference and the unreviewed companion-wallet references both fixes the length (336 and 332 chars vs. the 320 limit) and keeps consistency with other listings.

@bitcoinhelp — based on the review and Craig's feedback, a few changes are needed on the PR:

  1. Add taproot to the features line of all three files (_wallets/jadeclassic.md, jadeplus.md, jadecore.md).
  2. Shorten the descriptions in _translations/en.yml to under 320 characters (walletjadeclassic 336, walletjadeplus 332), removing the Liquid and companion-wallet references, as Craig suggests, should do it.
  3. Rebase onto current master and resolve the conflict in _wallets/jadecore.md, the branch is currently behind master and not mergeable.

@Cobra-Bitcoin, the only non-technical open item is the 3-month waiver on the Jade Core (launched 2026-04-28). Craig and I both recommend listing all three and waiving the time criterion on the Core, following the Coldcard Q precedent (identical firmware across the line). That decision is yours.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update Jade listing: Blockstream now distinguishes two distinct products — "Jade Plus" and "Jade Classic"

3 participants